package com.lyf.boot.modules.system.controller;

import com.lyf.boot.core.model.*;
import com.lyf.boot.modules.system.entity.dto.*;
import com.lyf.boot.modules.system.entity.vo.SysDictTypeVo;
import com.lyf.boot.modules.system.entity.vo.SysDictVo;
import com.lyf.boot.modules.system.service.ISysDictService;
import com.lyf.boot.validate.group.AddGroup;
import com.lyf.boot.validate.group.EditGroup;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 字典接口
 * @author Luyufan
 * @date 2023/7/7 16:52
 */
@RestController
@RequestMapping("/sysDict")
@RequiredArgsConstructor
public class SysDictController {

    private final ISysDictService sysDictService;

    /**
     * 分页获取字典类型
     * @return 字典类型分页数据
     */
    @PostMapping("/getSysDictTypePage")
    public R<PageInfo<SysDictTypeVo>> getSysDictTypePage(@RequestBody SysDictTypePageDto dto){
        return R.ok(sysDictService.getSysDictTypePage(dto));
    }

    /**
     * 获取字典类型列表
     * @return 字典类型列表数据
     */
    @PostMapping("/getSysDictTypeList")
    public R<List<OptionVo>> getSysDictTypeList(){
        return R.ok(sysDictService.getSysDictTypeList());
    }

    /**
     * 获取字典类型详情
     * @param dto 请求参数
     * @return 字典类型详情数据
     */
    @PostMapping("/getSysDictTypeInfo")
    public R<SysDictTypeVo> getSysDictTypeInfo(@RequestBody @Valid IdDto dto){
        return R.ok(sysDictService.getSysDictTypeInfo(dto.getId()));
    }

    /**
     * 添加字典类型
     * @param dto 请求参数
     * @return 保存结果
     */
    @PostMapping("/saveSysDictType")
    public R<Void> saveSysDictType(@RequestBody @Validated(AddGroup.class) SysDictTypeDto dto){
        sysDictService.saveSysDictType(dto);
        return R.ok();
    }

    /**
     * 修改字典类型
     * @param dto 请求参数
     * @return 求改结果
     */
    @PostMapping("/updateSysDictType")
    public R<Void> updateSysDictType(@RequestBody @Validated(EditGroup.class) SysDictTypeDto dto){
        sysDictService.updateSysDictType(dto);
        return R.ok();
    }

    /**
     * 删除字典类型
     * @param dto 请求参数
     * @return 删除结果
     */
    @PostMapping("/deleteSysDictType")
    public R<Void> deleteSysDictType(@RequestBody @Valid IdArrDto dto){
        sysDictService.deleteSysDictType(dto.getIds());
        return R.ok();
    }

    /**
     * 分页获取字典
     * @param dto 请求参数
     * @return 字典分页数据
     */
    @PostMapping("/getSysDictPage")
    public R<PageInfo<SysDictVo>> getSysDictPage(@RequestBody SysDictPageDto dto){
        return R.ok(sysDictService.getSysDictPage(dto));
    }

    /**
     * 字典详情
     * @param dto 请求参数
     * @return 详情数据
     */
    @PostMapping("/getSysDictInfo")
    public R<SysDictVo> getSysDictInfo(@RequestBody @Valid IdDto dto){
        return R.ok(sysDictService.getSysDictInfo(dto.getId()));
    }

    /**
     * 保存字典
     * @param dto 请求参数
     * @return 保存结果
     */
    @PostMapping("/saveSysDict")
    public R<Void> saveSysDict(@RequestBody @Validated(AddGroup.class) SysDictDto dto){
        sysDictService.saveSysDict(dto);
        return R.ok();
    }

    /**
     * 修改字典
     * @param dto 请求参数
     * @return 修改结果
     */
    @PostMapping("/updateSysDict")
    public R<Void> updateSysDict(@RequestBody @Validated(EditGroup.class) SysDictDto dto){
        sysDictService.updateSysDict(dto);
        return R.ok();
    }

    /**
     * 删除字典
     * @param dto 请求参数
     * @return 删除结果
     */
    @PostMapping("/deleteSysDict")
    public R<Void> deleteSysDict(@RequestBody @Valid IdArrDto dto){
        sysDictService.deleteSysDict(dto.getIds());
        return R.ok();
    }

    /**
     * 根据字典类型获取字典列表
     * @param dto 请求参数
     * @return 字典列表
     */
    @PostMapping("/getSysDictListByType")
    public R<List<SysDictVo>> getSysDictListByType(@RequestBody @Valid SysDictTypeQueryDto dto){
        return R.ok(sysDictService.getSysDictListByType(dto.getDictType()));
    }

    /**
     * 同步字典缓存
     * @return
     */
    @PostMapping("/asyncSysDict")
    public R<Void> asyncSysDict(){
        sysDictService.asyncSysDict();
        return R.ok();
    }
}
